import axios from 'axios'
import store from '@/store'
import router from "@/router";

const instance = axios.create({
    baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net/',
    timeout: 5000
})

// 2. 请求拦截器，携带token
instance.interceptors.request.use(
    (config) => {
        const { profile } = store.state.user;
        if (profile.token) {
            config.headers.Authorization = `Bearer ${profile.token}`;
        }
        return config;
    },
    (err) => Promise.reject(err)
);

// 3. 响应拦截器，取出内ret中的data，处理401错误
instance.interceptors.response.use(
    (ret) => ret.data,
    (err) => {
        if (err.response && err.response.status === 401) {
            // 清除用户信息
            store.commit("user/setProfile", {});
            // 跳转登录页
            router.push("/login");
        }
        return Promise.reject(err);
    }
)
// 2. 封装工具函数
// 2.1 三个参数：url,method,submitData (不用考虑提交数据放哪个选项)
// 2.2 函数里面：根据method去把提交数据放置对应的选项
// 2.3 把axios调用后的promise返回即可
/**
 * 请求工具函数
 * @param {string} url 请求地址
 * @param {string} method 请求方式
 * @param {object} submitData 提交数据
 * @returns Promise对象
 */
const request = (url, method, submitData) => {
    // axios({url,method,params,data}) === instance() 等价
    return instance({
        url,
        method,
        // submitData 应该放置哪个选项了？
        // 当请求方式是get的时候放params,当是其他请求方式一概放data
        // []插入一个动态的key，可以写变量，可以写三元，js表达式
        // method 传入：get Get GET ，为了程序健壮：转成小写再去匹配
        [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
    })
}

export default request
